home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Online / opennap / synch.c < prev    next >
C/C++ Source or Header  |  2001-06-08  |  4KB  |  165 lines

  1. /* Copyright (C) 2000-1 drscholl@users.sourceforge.net
  2.    This is free software distributed under the terms of the
  3.    GNU Public License.  See the file COPYING for details.
  4.  
  5.    $Id: synch.c,v 1.62 2001/02/15 08:39:45 drscholl Exp $ */
  6.  
  7. #include <stdio.h>
  8. #include <time.h>
  9. #include "opennap.h"
  10. #include "debug.h"
  11.  
  12. char   *Levels[LEVEL_ELITE + 1] = {
  13.     "Leech",
  14.     "User",
  15.     "Moderator",
  16.     "Admin",
  17.     "Elite"
  18. };
  19.  
  20. static void
  21. sync_user (USER * user, CONNECTION * con)
  22. {
  23.     ASSERT (validate_connection (con));
  24.     ASSERT (validate_user (user));
  25.  
  26.     /* we should never tell a peer server about a user that is behind
  27.        them */
  28.     ASSERT (user->con != con);
  29.     if (user->con == con)
  30.     {
  31.     /* this really shouldnt happen! */
  32.     ASSERT (0);
  33.     return;
  34.     }
  35.  
  36.     /* send a login message for this user */
  37.     send_cmd (con, MSG_CLIENT_LOGIN,
  38.           "%s %s %hu \"%s\" %d unknown %u %u %s %hu", user->nick,
  39.           user->pass, user->port, user->clientinfo, user->speed,
  40.           user->connected, user->ip, user->server, user->conport);
  41.  
  42.     /* update the user's level */
  43.     if (user->level != LEVEL_USER)
  44.     {
  45.     send_cmd (con, MSG_CLIENT_SETUSERLEVEL, ":%s %s %s",
  46.           Server_Name, user->nick, Levels[user->level]);
  47.     }
  48.  
  49.     if (user->cloaked)
  50.     send_cmd (con, MSG_CLIENT_CLOAK, ":%s 1", user->nick);
  51.  
  52.     /* do this before the joins so the user's already in the channel see
  53.        the real file count */
  54.     if (user->shared)
  55.     send_cmd (con, MSG_SERVER_USER_SHARING, "%s %hu %u", user->nick,
  56.           user->shared, user->libsize);
  57.  
  58.     /* MUST be after the join's since muzzled users cant join */
  59.     if (user->muzzled)
  60.     send_cmd (con, MSG_CLIENT_MUZZLE, ":%s %s", Server_Name, user->nick);
  61.  
  62.     /* NOTE: channel joins are handled in sync_channel */
  63. }
  64.  
  65. static void
  66. sync_chan (CHANNEL * chan, CONNECTION * con)
  67. {
  68.     LIST   *list;
  69.  
  70.     if (!chan->local)
  71.     {
  72.     for (list = chan->users; list; list = list->next)
  73.         sync_channel_user (con, chan, list->data);
  74.  
  75.     if (chan->level != LEVEL_USER)
  76.         send_cmd (con, MSG_CLIENT_SET_CHAN_LEVEL, ":%s %s %s %u",
  77.             Server_Name, chan->name, Levels[chan->level],
  78.             chan->timestamp);
  79.     if (chan->limit != 0)
  80.         send_cmd (con, MSG_CLIENT_CHANNEL_LIMIT, ":%s %s %d %u",
  81.             Server_Name, chan->name, chan->limit, chan->timestamp);
  82.  
  83.     if (chan->flags)
  84.         send_cmd (con, MSG_CLIENT_CHANNEL_MODE, ":%s %s%s%s%s%s :%u",
  85.             Server_Name, chan->name,
  86.             (chan->flags & ON_CHANNEL_PRIVATE) ? " +PRIVATE" : "",
  87.             (chan->flags & ON_CHANNEL_MODERATED) ? " +MODERATED" : "",
  88.             (chan->flags & ON_CHANNEL_INVITE) ? " +INVITE" : "",
  89.             (chan->flags & ON_CHANNEL_TOPIC) ? " +TOPIC" : "",
  90.             (chan->flags & ON_CHANNEL_REGISTERED) ? " +REGISTERED" : "",
  91.             chan->timestamp);
  92.  
  93.     sync_channel_bans (con, chan);
  94.     }
  95. }
  96.  
  97. static void
  98. sync_server_list (CONNECTION * con)
  99. {
  100.     LIST   *list;
  101.     LINK   *slink;
  102.     CONNECTION *serv;
  103.  
  104.     /* sync local servers */
  105.     for (list = Servers; list; list = list->next)
  106.     {
  107.     serv = list->data;
  108.     if (serv != con)
  109.     {
  110.         send_cmd (con, MSG_SERVER_LINK_INFO, "%s %hu %s %hu 2",
  111.               Server_Name, get_local_port (serv->fd),
  112.               serv->host, serv->port);
  113.     }
  114.     }
  115.  
  116.     /* sync remote servers */
  117.     for (list = Server_Links; list; list = list->next)
  118.     {
  119.     slink = list->data;
  120.     send_cmd (con, MSG_SERVER_LINK_INFO, "%s %hu %s %hu %d",
  121.           slink->server, slink->port, slink->peer, slink->peerport,
  122.           slink->hops + 1);
  123.     }
  124. }
  125.  
  126. static void
  127. sync_banlist (CONNECTION * con)
  128. {
  129.     LIST   *list;
  130.     BAN    *b;
  131.  
  132.     ASSERT (validate_connection (con));
  133.     for (list = Bans; list; list = list->next)
  134.     {
  135.     b = list->data;
  136.     ASSERT (b != 0);
  137.     send_cmd (con, MSG_CLIENT_BAN, ":%s %s \"%s\" %u", Server_Name,
  138.           b->target, b->reason, b->timeout);
  139.     }
  140. }
  141.  
  142. void
  143. synch_server (CONNECTION * con)
  144. {
  145.     ASSERT (validate_connection (con));
  146.  
  147.     log ("synch_server: syncing");
  148.  
  149.     /* send the current time of day to check for clock skew */
  150.     send_cmd (con, MSG_SERVER_TIME_CHECK, ":%s %u",
  151.           Server_Name, (int) time (&global.current_time));
  152.  
  153.     sync_server_list (con);
  154.     /* send our peer server a list of all users we know about */
  155.     hash_foreach (Users, (hash_callback_t) sync_user, con);
  156.     /* sync the channel level */
  157.     hash_foreach (Channels, (hash_callback_t) sync_chan, con);
  158.     sync_banlist (con);
  159.  
  160.     /* sync acls */
  161.     acl_sync (con);
  162.  
  163.     log ("synch_server: done");
  164. }
  165.